#include <stdio.h>
#include "oled.h"           // OLED显示屏驱动
#include "oled_fonts.h"     // OLED字体库
#include "cmsis_os2.h"      // CMSIS-RTOS2接口
#include "ohos_init.h"      // OpenHarmony初始化
#include "dataProcess.h"    // 数据处理模块
#include "button.h"         // 按钮控制模块
#include <stdlib.h>
#include "nfc.h"            // NFC功能模块
#include "i2c_example.h"    // I2C通信示例
#include "DHT11_driver.h"   // DHT11温湿度传感器驱动

// 全局变量定义
double temperatures[18] = {0};  // 存储最近18次温度值的历史记录
double humidities[18] = {0};    // 存储最近18次湿度值的历史记录
double tempMax = 50.0;          // 温度显示范围上限（初始值）
double tempMin = 0.0;           // 温度显示范围下限（初始值）
double humiMax = 90.0;          // 湿度显示范围上限（初始值）
double humiMin = 20.0;          // 湿度显示范围下限（初始值）
int flag = 0;                   // 通用标志位（当前未使用）

uint8_t result[200];            // 存储NFC写入结果的字符串缓冲区

// 主线程函数 - 程序核心逻辑
void mainThread(void *arg)
{
    (void)arg;  // 避免未使用参数警告
    
    // 初始化温湿度数组
    tempInit(temperatures, humidities);
    
    int tempIndex = 0;  // 温度数组当前写入位置索引
    int humiIndex = 0;  // 湿度数组当前写入位置索引

    // 主循环
    while (1)
    {
        // 重置极值变量
        tempMax = -1.0;
        tempMin = 100.0;
        humiMax = -1.0;
        humiMin = 100.0;
        flag = 0;  // 重置标志位（当前未使用）
        
        // 检测按钮模式（温度/湿度显示切换）
        int mode = buttonMode();
        
        // 计算最近18次数据的极值
        for(int i = 0; i < 18; i++)
        {
            // 调试输出
            printf("temp: %f, humi: %f\n", temperatures[i], humidities[i]);
            
            // 更新温度极值
            if(temperatures[i] > tempMax) tempMax = temperatures[i];
            if(temperatures[i] < tempMin) tempMin = temperatures[i];
            
            // 更新湿度极值
            if(humidities[i] > humiMax) humiMax = humidities[i];
            if(humidities[i] < humiMin) humiMin = humidities[i];
        }
        
        // 输出极值信息（调试用）
        printf("tempMax: %f, tempMin: %f, humiMax: %f, humiMin: %f\n", 
               tempMax, tempMin, humiMax, humiMin);
        
        // 短暂延迟
        osDelay(200);
        
        // 根据按钮模式更新OLED显示
        if (mode == 1)  // 温度显示模式
        {
            drawTempAxis();  // 绘制温度坐标轴
            
            // 循环绘制最近18个温度点（从当前索引开始）
            for (int i = 0; i < 18; i++)
            {
                drawTemp(temperatures[(i + tempIndex) % 18]);
            }
        }
        else if (mode == 0)  // 湿度显示模式
        {
            drawHumiAxis();  // 绘制湿度坐标轴
            
            // 循环绘制最近18个湿度点（从当前索引开始）
            for (int i = 0; i < 18; i++)
            {
                drawHumi(humidities[(i + humiIndex) % 18]);
            }
        }
        
        // 调试输出所有温湿度值
        for (size_t i = 0; i < 18; i++)
        {
            printf("temp: %f, humi: %f\n", temperatures[i], humidities[i]);
        }
        
        // 等待500ms
        osDelay(500);
        
        // 读取当前温度值
        double temp = DHT11_Temp();
        printf("——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————\n");
        printf("temp: %.1f\n", temp);
        
        // 更新温度数组（循环缓冲区）
        temperatures[tempIndex] = temp;
        tempIndex = (tempIndex + 1) % 18;  // 循环索引
        
        // 读取当前湿度值
        double humi = DHT11_Humidity();
        humidities[humiIndex] = humi;
        humiIndex = (humiIndex + 1) % 18;  // 循环索引
        
        // 更新OLED显示
        oledUpdate();
        
        // 格式化NFC写入字符串（包含最近7次温湿度数据）
        sprintf((char *)result, 
                "最近温度：%.1f℃\n"
                "近6次检测温度：%.1f℃，%.1f℃，%.1f℃，%.1f℃，%.1f℃，%.1f℃\n"
                "最近湿度：%.1f%%\n"
                "近6次检测湿度：%.1f%%，%.1f%%，%.1f%%，%.1f%%，%.1f%%，%.1f%%",
                temperatures[17],  // 最新温度
                // 倒数第2到第7次温度（共6个）
                temperatures[10], temperatures[11], temperatures[12], 
                temperatures[13], temperatures[14], temperatures[15], temperatures[16],
                humidities[17],   // 最新湿度
                // 倒数第2到第7次湿度（共6个）
                humidities[10], humidities[11], humidities[12], 
                humidities[13], humidities[14], humidities[15], humidities[16]);
        
        // 将格式化结果写入NFC标签
        writeText(result);
    }
}

// 创建主线程的函数
void creatThread(void)
{
    osThreadAttr_t attr;  // 线程属性结构体
    
    // 配置线程属性
    attr.name = "mainThread";    // 线程名称
    attr.attr_bits = 0U;         // 属性位（默认为0）
    attr.cb_mem = NULL;          // 控制块内存（系统分配）
    attr.cb_size = 0U;           // 控制块大小（系统分配）
    attr.stack_mem = NULL;       // 栈内存（系统分配）
    attr.stack_size = 10240;     // 栈大小（10KB）
    attr.priority = osPriorityNormal;  // 线程优先级（普通）
    
    // 创建线程
    if (osThreadNew(mainThread, NULL, &attr) == NULL)
    {
        printf("[mainThread] Falied to create mainThread!\n");
    }
}

// OpenHarmony应用入口宏
APP_FEATURE_INIT(creatThread);